package loja.dao.impl.hibernate;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import loja.dao.venda.VendaDAO;
import loja.model.pessoa.cliente.Cliente;
import loja.model.venda.ItemVenda;
import loja.model.venda.Venda;
import loja.model.venda.pedido.PedidoVenda;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class VendaDAOHibernate implements VendaDAO {

	private Session session;

	public VendaDAOHibernate(Session session) {
		this.session = session;
	}

	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}

	@Override
	public Long novoPedido() {

		PedidoVenda pedidoVenda = new PedidoVenda();

		Calendar data = Calendar.getInstance();
		data.setTime(new Date());

		pedidoVenda.setData(data);

		this.session.save(pedidoVenda);

		return pedidoVenda.getIdPedidoVenda();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoVenda> listarPedidosAbertos() {
		return this.session.createCriteria(PedidoVenda.class)
				.add(Restrictions.eq("status", Boolean.FALSE)).list();
	}

	@Override
	public PedidoVenda cosultarPedidoPorId(Long id) {
		return (PedidoVenda) this.session.createCriteria(PedidoVenda.class)
				.add(Restrictions.idEq(id)).uniqueResult();
	}

	@Override
	public void alterarPedidoVenda(PedidoVenda pedidoVenda) {
		this.session.update(pedidoVenda);
	}

	@Override
	public Long incluirVenda(Venda venda) {
		this.session.save(venda);
		return venda.getIdVenda();
	}

	@Override
	public void alterarValorVenda(Long idVenda, BigDecimal valor) {
		Venda venda = consultarVendaPorId(idVenda);
		venda.setValor(valor);
		this.session.update(venda);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarVendasAVista() {
		return this.session.createCriteria(Venda.class)
				.add(Restrictions.isNull("cliente")).list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarVendasAReceber() {
		return this.session.createCriteria(Venda.class)
				.add(Restrictions.isNotNull("cliente")).list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarVendas() {
		return this.session.createCriteria(Venda.class).list();
	}

	@Override
	public PedidoVenda cosultarPedidoAbertoPorId(Long id) {
		return (PedidoVenda) this.session.createCriteria(PedidoVenda.class)
				.add(Restrictions.idEq(id))
				.add(Restrictions.eq("status", false)).uniqueResult();
	}

	@Override
	public Venda consultarVendaPorId(Long id) {
		return (Venda) this.session.createCriteria(Venda.class)
				.add(Restrictions.idEq(id)).uniqueResult();
	}

	@Override
	public ItemVenda consultarItemVenda(Long id) {
		return (ItemVenda) this.session.createCriteria(ItemVenda.class)
				.add(Restrictions.idEq(id)).uniqueResult();
	}

	@Override
	public void removerPedidoVenda(PedidoVenda pedidoVenda) {
		this.session.delete(pedidoVenda);

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarVendasPorPeriodo(Calendar dataInicial,
			Calendar dataFinal) {

		return this.session.createCriteria(Venda.class)
				.add(Restrictions.between("data", dataInicial, dataFinal))
				.addOrder(Order.desc("data")).list();

	}

	@Override
	public void alteraQuantidadeItemVenda(Long id, Integer quantidade) {
		ItemVenda itemVenda = consultarItemVenda(id);
		Integer quantidadeAtual = itemVenda.getItemPedidoVenda()
				.getQuantidade();
		itemVenda.getItemPedidoVenda().setQuantidade(
				quantidade + quantidadeAtual);
		this.session.saveOrUpdate(itemVenda);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarVendasAReceberDeCliente(Cliente cliente) {
		return this.session.createCriteria(Venda.class)
				.add(Restrictions.eq("cliente", cliente)).list();
	}
}
